/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * EcranTexte.java
 *
 * Created on 8 avr. 2010, 09:14:16
 */

package vue;

import controleur.CCLogger;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.util.logging.Level;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import modele.TextePerso;
import vue.composants.ClavierVirtuel;
import vue.composants.ClavierVirtuelEcouteur;
import vue.composants.EcranTexteCPD;
import vue.composants.ListeCouleur;
import vue.composants.ListeCouleurEcouteur;
import vue.composants.ListePolices;

/**
 *
 * @author Synapse
 */
public class EcranTexte extends Ecran implements ListeCouleurEcouteur, ClavierVirtuelEcouteur {

    // Le modéle de carte postal redesiner
    private EcranTexteCPD cpd;

    // La liste déroulante des couleurs
    private ListeCouleur cmbCouleur;

    // La liste déroulante des polices
    private ListePolices cmbPolices;

    // La clavier virtuel
    private ClavierVirtuel clavier;

    // Pour récupérer le message du clavier
    private String message;

    // Pour le style du texte
    private boolean estGras;
    private boolean estItalique;
    private boolean estSouligne;
    private Color couleurChoisie;
    private Font fontChoisie;

    // Le texte a inscrire sur la carte postale
    private TextePerso textePerso;

    // La boite de dialogue qui contient le clavier virtuel
    private JDialog dia;

    // Le texte par défaut
    public final static String TEXTE_PAR_DEFAUT = "<Votre texte ici>";


    /**
     * Constructeur de la class EcranTexte
     * @param mere FenetreMere
     * @see FenetreMere
     */
    public EcranTexte(FenetreMere mere) {
        super(mere);
        initComponents();

        try
        {
            initCouleurs();
            initPolices();

            estGras = false;
            estItalique = false;
            estSouligne = false;

            // Texte par défaut
            message = TEXTE_PAR_DEFAUT;

            // Le CPD
            Dimension dim = new Dimension(536, 400);
            cpd = new EcranTexteCPD(ressources, this, ressources.getCartePostale(), "texte", dim );

            // Clavier virtuel, limité à la taille requise par le modèle
            int nbCarMax = ressources.getCartePostale().getModele().getZoneTexte().getNbCarMax();
            clavier = new ClavierVirtuel(this, nbCarMax);

            // Dialogue pour clavier
            dia = new JDialog();
            dia.setContentPane(clavier);
            dia.setSize(640,280);
            dia.setResizable(false);

            // On ajoute le CPD à l'écran
            panelCPD.add(cpd);

            // Pour initialisation
            redessiner();
        }
        catch (Exception ex) {
            CCLogger.Write(Level.SEVERE, ex.getStackTrace().toString());
            this.afficherMessageErreur(ex.getMessage());
        }
    }


    /**
     * Le controleur à besoin de cette méthode pour obtenir les caractéristiques du texte perso retenu.
     *
     * @return Le texte personnalisé retenu par l'utilisateur
     */
    public TextePerso getTextePerso() {

        TextePerso textePerso = new TextePerso(
                message,
                couleurChoisie,
                fontChoisie,
                estGras,
                estItalique,
                estSouligne
                );

        return textePerso;
    }

    /**
     * Getter pour la coueleur
     * @return Color, la couleur choisie
     */
    public Color getCouleurChoisie() {
        return couleurChoisie;
    }

    /**
     * Pour savoir sur le texte est en gras
     * @return boolean, true si le texte est en gras
     */
    public boolean isEstGras() {
        return estGras;
    }

    /**
     * Permet de savoir si le text est en italique
     * @return boolean, tru si le texte est en italique
     */
    public boolean isEstItalique() {
        return estItalique;
    }

    /**
     * Permet de savoir si le texte est souligné
     * @return boolean, true si le texte est souligné
     */
    public boolean isEstSouligne() {
        return estSouligne;
    }

    /**
     * Getter pour la police
     * @return Font, la police choisie
     */
    public Font getFontChoisie() {
        return fontChoisie;
    }

    /**
     * Getter pour le message du clavier virtuel
     * @return String, le message en provenance du clavier
     */
    public String getMessage() {
        return message;
    }


    /**
     * Demande un nouvel affichage du CPD dès lors qu'un paramètre à changé.
     */
    private void redessiner() {

//        String debug = "message = " + message + "\n"
//                + "couleur = " + couleurChoisie.toString() + "\n"
//                + "font = " + fontChoisie.getFontName() + "\n"
//                + "G = " + estGras + "\n"
//                + "I = " + estItalique + "\n"
//                + "S = " + estSouligne;
//        System.out.println(debug);

        cpd.repaint();
    }

    /**
     * Appelé par la liste de choix de la couleur.
     *
     * @param couleurChoisie La couleur selectionnée
     */
    public void couleurChangee(Color couleurChoisie) {
        this.couleurChoisie = couleurChoisie;
        redessiner();
    }

    /**
     * Appelé par la liste de choix de la font.
     *
     * @param fontChoisie La font selectionnée
     */
    public void setFontChoisie(Font fontChoisie) {
        this.fontChoisie = fontChoisie;
        redessiner();
    }

    /**
     * Affiche le clavier pour débuter la saisie.
     */
    private void debuterSaisie(){

        if( !message.equals(TEXTE_PAR_DEFAUT))
            clavier.initialiser(message);
        else
            clavier.initialiser("");
        
        dia.setLocation(250, 300); // T0D0 : Il serait mieux de centrer le dialogue sur la fenêtre
        dia.setVisible(true);
    }

    /**
     * Initialise la liste des couleurs.
     */
    private void initCouleurs(){

        cmbCouleur = new ListeCouleur(ressources, this, 300, 25);
        cmbCouleur.setSize(338,33);
        cmbCouleur.setLocation(13, 125);
        cmbCouleur.setVisible(true);
        cmbCouleur.setSelectionne(false);
        
        panOptionTexte.add(cmbCouleur);

        //On initialise la couleur coisie à la valeur de la combobox
        couleurChoisie = cmbCouleur.getCouleurCourante();
    }

    /**
     * Initialise la liste des polices.
     */
    private void initPolices(){

        cmbPolices = new ListePolices(this, ressources);
        cmbPolices.setSize(338, 33);
        cmbPolices.setLocation(13, 80);
        cmbPolices.setVisible(true);

        panOptionTexte.add(cmbPolices);

        //On initialise la font coisie à la valeur de la combobox
        fontChoisie = cmbPolices.getFontCourant();
    }


    /**
     * Appelée lors de l'annulation d'une saisie par clavier virtuel.
     */
    public void saisieAnnulee() {
        dia.setVisible(false);
    }

    /**
     * Appelée lors de l'annulation d'une saisie par clavier virtuel.
     *
     * @param saisie La chaine saisie par l'utilisateur.
     */
    public void saisieValidee(String saisie) {
        dia.setVisible(false);
        message = saisie;
        redessiner();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        labBandeau = new javax.swing.JLabel();
        btnPrecedent = new javax.swing.JButton();
        btnRecommencer = new javax.swing.JButton();
        btnSuivant = new javax.swing.JButton();
        panelCPD = new javax.swing.JPanel();
        panOptionTexte = new javax.swing.JPanel();
        chkGras = new javax.swing.JCheckBox();
        chkItalique = new javax.swing.JCheckBox();
        chkSouligne = new javax.swing.JCheckBox();
        btnTexte = new javax.swing.JButton();
        labIndication = new javax.swing.JLabel();

        setBackground(new java.awt.Color(255, 255, 255));
        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 255), 2));
        setMaximumSize(new java.awt.Dimension(1024, 768));
        setMinimumSize(new java.awt.Dimension(1024, 768));
        setPreferredSize(new java.awt.Dimension(1024, 768));

        labBandeau.setIcon(new javax.swing.ImageIcon(getClass().getResource("/vue/images/choixtexte.png"))); // NOI18N
        labBandeau.setMaximumSize(new java.awt.Dimension(1024, 88));
        labBandeau.setMinimumSize(new java.awt.Dimension(1024, 88));
        labBandeau.setPreferredSize(new java.awt.Dimension(1024, 88));

        btnPrecedent.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnPrecedent.setText("< Précédent");
        btnPrecedent.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPrecedentActionPerformed(evt);
            }
        });

        btnRecommencer.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnRecommencer.setText("Recommencer");
        btnRecommencer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRecommencerActionPerformed(evt);
            }
        });

        btnSuivant.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnSuivant.setText("Suivant >");
        btnSuivant.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSuivantActionPerformed(evt);
            }
        });

        panelCPD.setBackground(new java.awt.Color(255, 255, 255));
        panelCPD.setPreferredSize(new java.awt.Dimension(719, 551));

        javax.swing.GroupLayout panelCPDLayout = new javax.swing.GroupLayout(panelCPD);
        panelCPD.setLayout(panelCPDLayout);
        panelCPDLayout.setHorizontalGroup(
            panelCPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 613, Short.MAX_VALUE)
        );
        panelCPDLayout.setVerticalGroup(
            panelCPDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 501, Short.MAX_VALUE)
        );

        panOptionTexte.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 204, 255)));
        panOptionTexte.setPreferredSize(new java.awt.Dimension(719, 551));

        chkGras.setText("Gras");
        chkGras.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chkGrasActionPerformed(evt);
            }
        });

        chkItalique.setText("Italique");
        chkItalique.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chkItaliqueActionPerformed(evt);
            }
        });

        chkSouligne.setText("Souligné");
        chkSouligne.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chkSouligneActionPerformed(evt);
            }
        });

        btnTexte.setFont(new java.awt.Font("Tahoma", 0, 18));
        btnTexte.setText("Entrer un texte...");
        btnTexte.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnTexte.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTexteActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panOptionTexteLayout = new javax.swing.GroupLayout(panOptionTexte);
        panOptionTexte.setLayout(panOptionTexteLayout);
        panOptionTexteLayout.setHorizontalGroup(
            panOptionTexteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panOptionTexteLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panOptionTexteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(chkSouligne)
                    .addComponent(chkItalique)
                    .addComponent(chkGras)
                    .addComponent(btnTexte, javax.swing.GroupLayout.DEFAULT_SIZE, 342, Short.MAX_VALUE))
                .addContainerGap())
        );
        panOptionTexteLayout.setVerticalGroup(
            panOptionTexteLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panOptionTexteLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnTexte, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(115, 115, 115)
                .addComponent(chkGras)
                .addGap(18, 18, 18)
                .addComponent(chkItalique)
                .addGap(18, 18, 18)
                .addComponent(chkSouligne)
                .addContainerGap(59, Short.MAX_VALUE))
        );

        labIndication.setFont(new java.awt.Font("Tahoma", 0, 18));
        labIndication.setText("Personnalisez votre texte:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(labBandeau, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnPrecedent, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(panOptionTexte, javax.swing.GroupLayout.PREFERRED_SIZE, 364, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(65, 65, 65)
                        .addComponent(btnRecommencer, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 175, Short.MAX_VALUE)
                        .addComponent(btnSuivant, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panelCPD, javax.swing.GroupLayout.PREFERRED_SIZE, 613, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(labIndication)
                .addContainerGap(812, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(labBandeau, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(labIndication)
                        .addGap(82, 82, 82)
                        .addComponent(panOptionTexte, javax.swing.GroupLayout.PREFERRED_SIZE, 323, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(51, 51, 51)
                        .addComponent(panelCPD, javax.swing.GroupLayout.PREFERRED_SIZE, 501, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 77, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnPrecedent, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnRecommencer, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(btnSuivant, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

     /**
     * Ecouteur pour le bouton "Précédent".
     * Indique au controleur que l'utilisateur souhaite revenir sur l'écran précédent
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnPrecedentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPrecedentActionPerformed
        controleur.trTextePrecedent();
}//GEN-LAST:event_btnPrecedentActionPerformed

     /**
     * Ecouteur pour le bouton "Recommencer".
     * Indique au controleur que l'utilisateur souhaite recommencer
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnRecommencerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRecommencerActionPerformed
        controleur.trRecommencer();
}//GEN-LAST:event_btnRecommencerActionPerformed

     /**
     * Ecouteur pour le bouton "Suivant".
     * Indique au controleur que l'utilisateur souhaite revenir sur l'écran suivant
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnSuivantActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSuivantActionPerformed
        controleur.trTexteSuivant();
}//GEN-LAST:event_btnSuivantActionPerformed

     /**
     * Ecouteur pour la checkbox "Souligné".
     * Indique que l'utilisateur souhaite souligné le texte
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void chkSouligneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkSouligneActionPerformed
        estSouligne = chkSouligne.isSelected();
        redessiner();
    }//GEN-LAST:event_chkSouligneActionPerformed

     /**
     * Ecouteur pour la checkbox "Gras".
     * Indique que l'utilisateur souhaite mettre en gars le texte
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void chkGrasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkGrasActionPerformed
        estGras = chkGras.isSelected();
        redessiner();
    }//GEN-LAST:event_chkGrasActionPerformed

     /**
     * Ecouteur pour le bouton "Texte".
     * Indique que l'utilisateur souhaite entrez un texte et appele le clavier virtuel
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void btnTexteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTexteActionPerformed
        debuterSaisie();
    }//GEN-LAST:event_btnTexteActionPerformed

     /**
     * Ecouteur pour la checkbox "Italique".
     * Indique que l'utilisateur souhaite mettre en italique le texte
     * Pas de retour.
     * @param evt java.awt.event.ActionEvent
     */
    private void chkItaliqueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkItaliqueActionPerformed
        estItalique = chkItalique.isSelected();
        redessiner();
    }//GEN-LAST:event_chkItaliqueActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnPrecedent;
    private javax.swing.JButton btnRecommencer;
    private javax.swing.JButton btnSuivant;
    private javax.swing.JButton btnTexte;
    private javax.swing.JCheckBox chkGras;
    private javax.swing.JCheckBox chkItalique;
    private javax.swing.JCheckBox chkSouligne;
    private javax.swing.JLabel labBandeau;
    private javax.swing.JLabel labIndication;
    private javax.swing.JPanel panOptionTexte;
    private javax.swing.JPanel panelCPD;
    // End of variables declaration//GEN-END:variables




}